package comprehensive;

public class Exercises11 {
    // 36、有效的数独
    boolean[][] row; // 行
    boolean[][] col; // 列
    boolean[][][] grid; // 3x3 宫格

    public boolean isValidSudoku(char[][] board) {
        // 初始化
        row = new boolean[9][10]; // 第一个为9行，10为数字1-9存入的值进行判断是否储存在，比如row[1][5] 表示第1行中的数字5是否为false
        col = new boolean[9][10]; // 第一个为9列，10为数字1-9存入的值进行判断是否储存在，比如col[2][7] 表示第2列中的数字7是否为false
        grid = new boolean[3][3][10]; // 这个呢就是把每三格当做一个格子处理，在3X3这个大格子中，去查询

        for(int i = 0;i < 9;i++) {
            for(int j = 0;j < 9;j++) {
                if(board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    // 这里的col[j][num]表示的是第i行中9列的第i个数，每次走一次i酒便利一次列上面第i个数
                    if(row[i][num] || col[j][num] || grid[i/3][j/3][num]){
                        return false;
                    }
                    row[i][num] = col[j][num] = grid[i/3][j/3][num] = true;
                }
            }
        }

        return true;
    }
}
